package com.wbao.dianniu.update;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import com.wbao.dianniu.customView.CustomDialog;
import com.wbao.dianniu.data.VersionData;
import com.wbao.dianniu.listener.ICheckUpdateListener;
import com.wbao.dianniu.manager.CheckUpdateManager;
import com.wbao.dianniu.R;

public class UpdateManager implements ICheckUpdateListener{
	/* 下载中 */
	private static final int DOWNLOAD = 1;
	/* 下载结束 */
	private static final int DOWNLOAD_FINISH = 2;
	/* 下载服务器版本文件	*/
	private static final int DOWNLOAD_VERSION=3;
	/* 未检测到更新	*/
	private static final int NO_UPDATE=4;
	/* 保存解析的XML信息 */
//	HashMap<String, String> mHashMap;
	/* 下载保存路径 */
	private String mSavePath;
	/* 记录进度条数量 */
	private int progress;
	/* 是否取消更新 */
	private boolean cancelUpdate = false;

	private Context mContext;
	/* 更新进度条 */
	private ProgressBar mProgress;
	private Dialog mDownloadDialog;
	private static ICheckCompletedListener mListener; 
	private CheckUpdateManager manager;
	private String apkUrl = null;
	
	public interface ICheckCompletedListener{
		public void checkCompleted();
		public void noCheck();
	}
	
	public void addCheckListener(ICheckCompletedListener listener){
		mListener = listener;
	}
	public void removeCheckListener(){
		manager.removeCheckUpdateListener(this);
		mListener = null;
	}

	private Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			// 正在下载
			case DOWNLOAD:
				// 设置进度条位置
				mProgress.setProgress(progress);
				break;
			case DOWNLOAD_FINISH:
				// 安装文件
				installApk();
				break;
			case DOWNLOAD_VERSION:
				if(null != mListener){
					mListener.checkCompleted();
				}
				// 显示提示对话框
				showNoticeDialog();
				break;
			case NO_UPDATE:
				if(null != mListener){
					mListener.noCheck();
				}
			break;
			default:
				break;
			}
		};
	};

	public UpdateManager(Context context) {
		this.mContext = context;
		manager = new CheckUpdateManager(mContext);
		manager.addCheckUpdateListener(this);
	}

	/**
	 * 检测软件更新
	 */
	public void checkUpdate() {
		manager.checkUpdate();
	}

	/**
	 * 获取软件版本号
	 * 
	 * @param context
	 * @return
	 */
	private int getVersionCode(Context context) {
		int versionCode = 0;
		try {
			// 获取软件版本号，对应AndroidManifest.xml下android:versionCode
			versionCode = context.getPackageManager().getPackageInfo("com.wbao.dianniu", 0).versionCode;
		} catch (NameNotFoundException e) {
			e.printStackTrace();
		}
		return versionCode;
	}

	/**
	 * 显示软件更新对话框
	 */
	private void showNoticeDialog() {
		CustomDialog.Builder builder = new CustomDialog.Builder(mContext);  
		builder.setTitle("软件更新");
		builder.setMessage("检测到新版本，是否立即更新？");
		builder.setMessageVisbily(true);
        builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog, int which) {  
            	dialog.dismiss();
				// 显示下载对话框
				showDownloadDialog();
            }  
        });  
        builder.setNegativeButton("取消",  new android.content.DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int which) {  
                        dialog.dismiss();  
                    }  
                });  
        builder.create().show();  
		
	}

	/**
	 * 显示软件下载对话框
	 */
	private void showDownloadDialog() {
		mDownloadDialog = new Dialog(mContext, R.style.custom_Dialog);
		LayoutInflater inflater = LayoutInflater.from(mContext);
		View v = inflater.inflate(R.layout.softupdate_progress, null);
		mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
		Button cancel = (Button) v.findViewById(R.id.cancelBtn);
		cancel.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				mDownloadDialog.dismiss();
				// 设置取消状态
				cancelUpdate = true;
			}
		});
		mDownloadDialog.setContentView(v);
		// 构造软件下载对话框
		/*AlertDialog.Builder builder = new Builder(mContext);
		builder.setTitle("正在更新");
		// 给下载对话框增加进度条
		final LayoutInflater inflater = LayoutInflater.from(mContext);
		View v = inflater.inflate(R.layout.softupdate_progress, null);
		mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
		Button cancel = (Button) v.findViewById(R.id.cancelBtn);
		cancel.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mDownloadDialog.dismiss();
				// 设置取消状态
				cancelUpdate = true;
			}
		});
		builder.setView(v);*/
		
		// 取消更新
		/*builder.setNegativeButton("取消",
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						// 设置取消状态
						cancelUpdate = true;
					}
				});
		mDownloadDialog = builder.create();*/
		mDownloadDialog.show();
		// 现在文件
		downloadApk();
	}

	/**
	 * 下载apk文件
	 */
	private void downloadApk() {
		// 启动新线程下载软件
		new downloadApkThread().start();
	}

	/**
	 * 下载文件线程
	 * 
	 * @author coolszy
	 * @date 2012-4-26
	 * @blog http://blog.92coding.com
	 */
	private class downloadApkThread extends Thread {
		@Override
		public void run() {
			try {
				// 判断SD卡是否存在，并且是否具有读写权限
				if (Environment.getExternalStorageState().equals(
						Environment.MEDIA_MOUNTED)) {
					// 获得存储卡的路径
					String sdpath = Environment.getExternalStorageDirectory()+ "/";
					mSavePath = sdpath + "download";
					
					if(null == apkUrl){
						return;
					}
					URL url = new URL(apkUrl);
					// 创建连接
					HttpURLConnection conn = (HttpURLConnection) url.openConnection();
					conn.connect();
					// 获取文件大小
					int length = conn.getContentLength();
					// 创建输入流
					InputStream is = conn.getInputStream();

					File file = new File(mSavePath);
					// 判断文件目录是否存在
					if (!file.exists()) {
						file.mkdir();
					}
					File apkFile = new File(mSavePath, "dianniu.apk");
					FileOutputStream fos = new FileOutputStream(apkFile);
					int count = 0;
					// 缓存
					byte buf[] = new byte[1024];
					// 写入到文件中
					do {
						int numread = is.read(buf);
						count += numread;
						// 计算进度条位置
						progress = (int) (((float) count / length) * 100);
						// 更新进度
						mHandler.sendEmptyMessage(DOWNLOAD);
						if (numread <= 0) {
							// 下载完成
							mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
							break;
						}
						// 写入文件
						fos.write(buf, 0, numread);
					} while (!cancelUpdate);// 点击取消就停止下载.
					fos.close();
					is.close();
				}
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			// 取消下载对话框显示
			mDownloadDialog.dismiss();
		}
	};

	/**
	 * 安装APK文件
	 */
	private void installApk() {
		File apkfile = new File(mSavePath, "dianniu.apk");
		if (!apkfile.exists()) {
			return;
		}
		// 通过Intent安装APK文件
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + apkfile.toString()),"application/vnd.android.package-archive");
		mContext.startActivity(i);
	}
	@Override
	public void onCheckFailure(int errorCode, String errorMsg) {
		// TODO Auto-generated method stub
		Message msg = new Message();
		msg.what = NO_UPDATE;
		mHandler.sendMessage(msg);
	}
	@Override
	public void onCheckSuccess(VersionData versionData) {
		if(null == versionData){
			Message msg = new Message();
			msg.what = NO_UPDATE;
			mHandler.sendMessage(msg);
			return ;
		}
		int serviceCode = versionData.getVersionCode();
		int versionCode = getVersionCode(mContext);
		Log.e("yjj", "serviceCode:" + serviceCode + "/  verionCode:" + versionCode );
		apkUrl = versionData.getApkUrl();
		// 版本判断
		if (serviceCode > versionCode) {
			Message msg = new Message();
			msg.what = DOWNLOAD_VERSION;
			mHandler.sendMessage(msg);
		}else{
			Message msg = new Message();
			msg.what = NO_UPDATE;
			mHandler.sendMessage(msg);
		}
	}
}
